<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  // const obj = {}
  // const obj2 = new Object();

  // 单例模式的弹出框

  // const obj = {
  //   init:function(ops){}
  // }
  // obj.init(...)

  // 闭包实现单例模式的封装
  // const createObj = (function(){
  //   const obj = {};
  //   return function(name){
  //     obj.name = name;
  //     return obj;
  //   }
  // })();

  // const o1 = createObj("admin");
  // console.log(o1);
  
  // const o2 = createObj("zhangsan");
  // console.log(o2);

  // const o3 = createObj("lisi");
  // console.log(o3);

  // console.log(o1 === o2);
  // console.log(o1 === o3);
  // console.log(o2 === o3);

  // ========
  
  // 利用函数自身作为载体，创建单例对象
  function createObj(name){
    // 判断函数身上是否具有指定的自定义属性，如果没有
    if(!createObj.obj){
      // 添加自定义属性，值为对象
      createObj.obj = {};
    }
    // 操作函数身上的这个自定义对象属性
    createObj.obj.name = name;
    // 返回这个自定义对象属性，覆盖new的返回值
    return createObj.obj;
  }

  const o1 = new createObj("admin");
  console.log( o1 );
  const o2 = new createObj("wanger");
  console.log( o2 );
  const o3 = new createObj("赵五");
  console.log( o3 );

  console.log(o1 === o2);
  console.log(o1 === o3);
  console.log(o2 === o3);

  // new的原理
    // 创建新对象
    // this指向新对象
    // ...
    // 执行函数代码
    // 是否返回对象，如无，就返回this



</script>
</html>